/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package proy2redes;

/**
 *
 * @author jose
 */
import java.io.*;
import java.util.*;
import java.net.*;

public class dcli {
    private static String HOSTDREP = "localhost";
    private static String PUERTODREP = "31109";
    private static String LDIRECTORIO = ".";
    //private static String ARCHIVO = null;
    private static String NOMBRE = "guest";

    private String hostdrep;
    private int puertodrep;
    private String ldirectorio;
    private String archivo;
    private String nombre;

    public dcli(String hostdrep, int puertodrep, String ldirectorio, String archivo, String nombre) {
        this.hostdrep = hostdrep;
        this.puertodrep = puertodrep;
        this.ldirectorio = ldirectorio;
        this.archivo = archivo;
        this.nombre = nombre;
    }


/*
    public String getArchivo() {
        return archivo;
    }

    public void setArchivo(String archivo) {
        this.archivo = archivo;
    }

    public String getHostdrep() {
        return hostdrep;
    }

    public void setHostdrep(String hostdrep) {
        this.hostdrep = hostdrep;
    }

    public String getLdirectorio() {
        return ldirectorio;
    }

    public void setLdirectorio(String ldirectorio) {
        this.ldirectorio = ldirectorio;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public int getPuertodrep() {
        return puertodrep;
    }

    public void setPuertodrep(int puertodrep) {
        this.puertodrep = puertodrep;
    }
*/
    public static HashMap organizarEntrada(String[] args){
        HashMap map = new HashMap();

        int tam = args.length;
        System.out.println("OrganizarEntrada " +tam);
        if (tam%2!=0) {
            return null;
        }
        int i = 0;
        while (i<tam){
            map.put(args[i], args[i+1]);
            i = i+2;
        }
        System.out.println("Tamano del Map: "+map.size());
        return map;
    }

    public static boolean comprobarEntrada(String[] args,String[] values){
        boolean valido = false;
        HashMap map = organizarEntrada(args);
        if (map==null){
            return false;
        }

        if (map.containsKey("-h")){
            values[0] = (String)map.get("-h");
            map.remove("-h");
        }
        if (map.containsKey("-p")){
            values[1] = (String)map.get("-p");
            map.remove("-p");
        }
        if (map.containsKey("-d")){
            values[2] = (String)map.get("-d");
            map.remove("-d");
        }
        if (map.containsKey("-a")){
            values[3] = (String)map.get("-a");
            map.remove("-a");
        }
        if (map.containsKey("-n")){
            values[4] = (String)map.get("-n");
            map.remove("-n");
        }
        if (map.isEmpty())
            valido = true;

        return valido;
    }

    private boolean procesarComando(String comando,BufferedReader in,
            PrintWriter out,InputStream inS, OutputStream outS) throws Exception{
        String[] comA = comando.split("[\\s]+");
        String response;
        String nombreCom = comA[0];
        boolean terminar = false;
        if (nombreCom.equals("ldir")){
            String s = manejoArchivos.listarDirectorio(this.ldirectorio);
            System.out.println(s);

        } else if (nombreCom.equals("rdir")) {
            out.println(comando);
            //Arreglar
            while((response = in.readLine())!=null){
                if (response.equals(".")){
                    break;
                }
                
                System.out.println(response);
            }
            System.out.println("termina rdir en cliente");

        } else if (nombreCom.equals("sube")) {
            String arch = this.ldirectorio+"/"+comA[1];
            out.println(comando);
            manejoArchivos.copiarArchivo(arch, outS);
            //out.println(comando);

            //manejoArchivos.enviarArchivo("sube", comA[1],
            //        this.ldirectorio, out);

        } else if (nombreCom.equals("baja")) {
            out.println(comando);
            manejoArchivos.pegarArchivo(this.ldirectorio, inS);
            /*String arch = this.ldirectorio+"/"+comA[1];
            response = in.readLine();
            if (response.startsWith("Error")){
                System.out.println(response);
            } else {
                manejoArchivos.recibirArchivo(arch, in);
            }*/

        } else if (nombreCom.equals("cat")) {
            String arch = this.ldirectorio+"/"+comA[1];
            String s = manejoArchivos.contenido(arch);
            System.out.println(s);
        } else if (nombreCom.equals("QUIT")) {
            terminar = true;
            out.println(comando);
        }
        return terminar;
    }

public static void main(String[] args) {

    String[] valores = new String[5];
    valores[0] = HOSTDREP;
    valores[1] = PUERTODREP;
    valores[2] = LDIRECTORIO;
    valores[3] = null;
    valores[4] = NOMBRE;
    boolean b = comprobarEntrada(args,valores);

    if (!b) {
      System.out.println("Error en los parametros de entrada");
      return;
    }

    String host = valores[0];
    int port = Integer.parseInt(valores[1]);
    String direct = valores[2];direct = "/home/jose/Descargas";//Quitar
    String arch = valores[3];
    String name = valores[4];
    dcli cliente = new dcli(host, port, direct, arch, name);
    //dcli cliente = new dcli();
    //cliente.setLdirectorio("/home/jose/Descargas");

// Socket por el que se conectara el cliente
Socket client;

// Canal de entrada para el cliente
BufferedReader in = null;

// Canal de salida hacia el servidor
PrintWriter out = null;

BufferedReader inA = new BufferedReader(
		    new InputStreamReader(System.in));
String mensA = "";
boolean quit = false;

String welcome;

    try {
        client = new Socket(cliente.hostdrep, cliente.puertodrep);
        System.out.println("Puerto del cliente: " + client);

        InputStream inS = client.getInputStream();
        OutputStream outS = client.getOutputStream();
        in = new BufferedReader(new InputStreamReader(inS));
        out = new PrintWriter(outS, true);

        welcome = in.readLine();
        System.out.println("El servidor dice: '"+ welcome +"'");

        //Leer comandos del archivo
        LinkedList listaComandos = manejoArchivos.comandosArchivo(arch);
        if (listaComandos != null){
            for (int i=0;i<listaComandos.size(); i++){
                mensA = (String)listaComandos.get(i);
                cliente.procesarComando(mensA, in, out,inS,outS);
            }
        }
        //String s = "/home/jose/Descargas/lucia.mp3";
        //manejoArchivos.copiarArchivo(s, client.getOutputStream());

	while(!quit){
	  mensA = inA.readLine();
          quit = cliente.procesarComando(mensA, in, out,inS,outS);
	  
	}

    }
    catch (IOException e) {
        System.out.println("Excepcion IOException en in.readln()");
        System.out.println(e);
    }
    catch (Exception e) {
        System.out.println(e);
    }
    try {Thread.sleep(2000);} catch (Exception ignored) {}
} // End of main method.

} // End of ClientTest class.


